package cn.kgc.commons.advice;

import cn.kgc.base.entity.SysDict;
import cn.kgc.base.entity.SysDictItem;
import cn.kgc.base.mapper.SysDictItemMapper;
import cn.kgc.base.mapper.SysDictMapper;
import cn.kgc.commons.annoation.Dict;
import cn.kgc.commons.constant.SysDictItemStatus;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>添加描述信息</p>
 *
 * @author 卢传琪
 * 翻译返回值的常量
 */
@Aspect
@Component
@Slf4j
public class AutoDictAdvice {
    @Resource
    private SysDictMapper sysDictMapper;

    @Resource
    private SysDictItemMapper sysDictItemMapper;


    @Pointcut("@annotation(cn.kgc.commons.annoation.AutoDict)")
    public void autoDictPointCut(){}

    @Around(value = "autoDictPointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //调用目标方法
        Object result = proceedingJoinPoint.proceed();
        result=parseResultDictText(result);
        return result;
    }

    /**
     * 解析返回值
     * @param result
     * @return
     */
    private Object parseResultDictText(Object result) throws Exception {
        if(result instanceof IPage){// 目标方法返回的是分页数据
            ObjectMapper objectMapper = new ObjectMapper();
            //获得分页数据
            List<Object> objectList=((IPage) result).getRecords();
            //存储处理后的数据
            List<JSONObject> resultList=new ArrayList<>();
            for (Object o : objectList) {
                String jsonString=objectMapper.writeValueAsString(o);
                //将json字符串转换为json对象
                //将原有的每条数据转为jsonObject类型的，jsonObject对象中的属性的值
                //来自原有的每条数据（可以很方便的给jsonObject对象添加属性）
                JSONObject jsonObject=JSONObject.parseObject(jsonString, Feature.OrderedField);
                //log.info(jsonObject.toJSONString());
                //原有的属性上是否含有@Dict注解，如果属性上含有@Dict注解，需要进行转换
                Field [] fields=o.getClass().getDeclaredFields();
                for (Field temp : fields) {
                    temp.setAccessible(true);//如果属性的访问修饰符是private，需要设置为可访问
                    //原有属性上是否含有dict注解，如果有，获得注解
                    if (temp.isAnnotationPresent(Dict.class)){
                        Dict dict=temp.getAnnotation(Dict.class);
                        String dictCode= dict.dictCode();//获得注解中的字典编码
                        String fieldName=temp.getName();//获得属性名
                        Object fieldValue=jsonObject.get(fieldName);//获得属性值
                        //String fieldValue=temp.get(o).toString();
                        //log.info("字典编码：{}，属性名：{}，属性值：{}",dictCode,fieldName,fieldValue);
                        LambdaQueryWrapper<SysDict> lambdaQueryWrapper=new LambdaQueryWrapper<>();
                        lambdaQueryWrapper.eq(SysDict::getDictCode,dictCode);
                        SysDict sysDict=sysDictMapper.selectOne(lambdaQueryWrapper);
                        if (sysDict!=null){
                            Long dictID=sysDict.getId();
                            LambdaQueryWrapper<SysDictItem> sysDictItemLambdaQueryWrapper=new LambdaQueryWrapper<>();
                            sysDictItemLambdaQueryWrapper.eq(SysDictItem::getDictId,dictID);
                            sysDictItemLambdaQueryWrapper.eq(SysDictItem::getItemValue,fieldValue);
                            sysDictItemLambdaQueryWrapper.eq(SysDictItem::getStatus, SysDictItemStatus.ENABLE.getStatus());
                            SysDictItem sysDictItem=sysDictItemMapper.selectOne(sysDictItemLambdaQueryWrapper);
                            if (sysDictItem!=null){
                                //新的属性名
                                fieldName=fieldName+"_txt";
                                jsonObject.put(fieldName,sysDictItem.getItemText());
                            }
                        }
                    }
                }
                resultList.add(jsonObject);
            }
            //将处理后的数据放到result中
            ((IPage) result).setRecords(resultList);
        }
        return result;
    }
}
